package org.example.study6;

public class SingletonHungry {
    // 关键字 private：将变量设为私有，禁止外部直接访问，防止绕过 getInstance() 方法获取实例，确保实例化流程可控。
    // 定义一个类的成员变量，用static修饰，静态成员变量，静态变量属于类（而非对象），保证全局唯一性
    // 类加载时立即初始化实例（饿汉式核心特征），无论是否立即使用该实例。

    /*直接实例化 new SingletonHungry()：
    在类加载阶段（而非首次调用 getInstance() 时）直接创建单例对象。
    优点：避免多线程同步问题（由 JVM 类加载机制保证线程安全）。
    缺点：若实例占用资源大且未被使用，会导致资源浪费。*/
    private static SingletonHungry instance = new SingletonHungry();

    // 私有化构造方法，禁止外部通过 new 关键字new SingletonHungry()创建实例，确保实例化控制权在类自身
    // 单例模式的核心约束：唯一性。如果构造方法公开，任何代码都可以随意创建实例，破坏单例
    private SingletonHungry() {}

    /**
     * 公开的静态方法，提供全局访问点以获取唯一实例
     * @return 返回预先创建好的单例对象
     */

    /*
    关键字 public：提供全局访问点，允许外部通过此方法获取单例对象。
    关键字 static：方法属于类而非对象，无需实例化即可调用（SingletonHungry.getInstance()）。
    直接返回 instance：返回类加载时已初始化的静态实例，确保所有调用者获取的是同一个对象。
    无需同步：因实例在类加载时已创建，天然线程安全。*/
    public static SingletonHungry getInstance() {
        // 直接返回已初始化的静态实例（全局唯一对象）
        return instance;
    }
}

/*解决的问题与作用
问题：确保系统中一个类仅有一个实例，避免重复创建导致资源浪费或状态不一致。
作用：
1. 全局唯一性：通过静态变量和私有构造方法强制单例。
2. 线程安全：实例在类加载时初始化，由 JVM 保证线程安全。
3. 延迟加载（无）：与“懒汉式”不同，饿汉式在类加载时立即初始化实例。*/


/*现象与特点
现象：
1. 类首次加载时（如调用 getInstance() 或访问其他静态成员）立即创建实例。
2. 后续所有 getInstance() 调用均返回同一对象。
3. 反射/序列化可能破坏单例（需额外防护）。

优点：
实现简单，线程安全。
无同步开销，性能高。

缺点：
类加载时即初始化实例，若实例占用资源大且未被使用，会导致资源浪费。
不支持延迟加载。*/


/*总结：为什么这样设计？
1. 强制单例唯一性：
通过 private 构造方法禁止外部实例化。
通过 static 变量在类加载时创建唯一实例。
通过 getInstance() 统一提供访问入口。

2. 线程安全：
利用 JVM 类加载机制保证实例初始化时的线程安全，无需额外同步代码。

3. 简单高效：
无延迟加载，但实现简单，无多线程竞争问题。
适用于实例较小且初始化不耗资源的场景。*/